// 读入流：createReadStream中不存在参数path文件或文件夹则报错，被error事件监听
// 1.创建读入流
const readerStream = require('fs').createReadStream('./static/stream_input.txt');
readerStream.setEncoding('utf8');

// 2.事件处理
readerStream.on('data', function (data) {
  console.log('data', data);
});
readerStream.on('end', function () {
  console.log('end');
});
readerStream.on('error', function (error) {
  console.log('error', error);
});


// 写入流：createWriteStream中不存在参数path文件则创建，不存在参数path文件夹则报错，被error事件监听
// 1.创建写入流并写入数据，写入完成后标记结束
const writerStream = require('fs').createWriteStream('./static/stream_output.txt');
writerStream.write('Stream中有四种流类型和四种事件', 'utf8');
writerStream.end();

// 2.事件处理
writerStream.on('finish', function () {
  console.log('finish');
});
writerStream.on('error', function (error) {
  console.log('error', error);
});


// 管道流：管道pipe提供输出流到输入流的机制，常用于从一个流中获取数据并将数据传递到另外一个流中
// 1.创建读入流和写入流
const pipeReaderStream = require('fs').createReadStream('./static/pipe_stream_input.txt');
const pipeWriterStream = require('fs').createWriteStream('./static/pipe_stream_output.txt');

// 2.管道读写操作：读出文件内容pipeReaderStream，将文件内容传入pipeWriterStream
pipeReaderStream.pipe(pipeWriterStream);


// 链式流：链式流一般用于管道操作pipe
// 1.压缩文件：读出文件内容，将文件内容压缩，将压缩后的内容写入文件
require('fs').createReadStream('./static/chain_stream.txt')
  .pipe(require('zlib').createGzip())
  .pipe(require('fs').createWriteStream('./static/chain_stream.txt.gz'));

// 2.解压文件：读出压缩文件内容，将压缩文件内容解压，将解压后的内容写入文件
require('fs').createReadStream('./static/chain_stream.txt.gz')
  .pipe(require('zlib').createGunzip())
  .pipe(require('fs').createWriteStream('./static/chain_stream_zip.txt'));